#include <iostream>
using namespace std;

#include <stdio.h>
#include <string>
#include <cstdlib>

#ifdef __WIN32__
#include <windows.h>
#include <conio.h>
#endif

#include "..\allmap\Area.h"
#include "..\player\INVENTORY.h"

///////////////////////////////////////////////////////////////////
///////KELAS DISPLAY                                     //////////
///////////////////////////////////////////////////////////////////

//Deskripsi kelas:
//Objek hasil instansiasi dari kelas display memiliki sifat
//yang berhubungan dengan tampilan program di mata pengguna program
//dan menyediakan fasilitas - fasilitas yang berhubungan dengan User Interface

class Display {
	private :
		int FSave[8][10];					//Atribut yang menyimpan informasi dari grid yang ditampilkan di tengah layar
		int StKricer[4][3];					//Atribut yang menyimpan pada suatu keadaan, apakah ada creature yang ditampilkan atau tidak
			//Index ke-1 untuk menunjukkan kricer
				//0 : Player
				//1 : Kurcaci 1
				//2 : Kurcaci 2
				//3 : Kurcaci 3
			//Index ke-2 untuk menunjukkan properties dari kricer
				//0 : Direction
				//1 : Posisi X
				//2 : Posisi Y
		int ODMeter;						//Atribut yang menyimpan informasi dari keadaan OverDosis player untuk ditampilkan ke layar
		int SkwMeter;						//Atribut yang menyimpan informasi dari keadaan Sakaw player untuk ditampilkan ke layar
				
	public :
		//Konstruktor
		Display();
	
		//Method Set
		void	SetODMeter						(int N)						{ODMeter = N;};		//merubah nilai OverDosis Meter
		void	SetSkwMeter						(int N)						{SkwMeter = N;};	//merubah nilai SakawMeter
		void 	operator<< 						(int FL[8][10]);								//Operator yang digunakan sebagai lambang input
																								//dari suatu array of array of integer 8x10
																								//ke dalam atribut dari kelas Display
		
		//Rangkaian Set StKricer
			//berisik seluruh method untuk merubah nilai posisi dan arah hadap yang mungkin dilakukan, yaitu player,
			//kurcaci 1,2,dan 3.
		void 	SetPlayer						(int x, int y, int dir)		{StKricer[0][0] = dir;StKricer[0][1] = x; StKricer[0][2] = y;} 
		void 	SetKurcaci1						(int x, int y, int dir)		{StKricer[1][0] = dir;StKricer[1][1] = x; StKricer[1][2] = y;}  
		void 	SetKurcaci2						(int x, int y, int dir)		{StKricer[2][0] = dir;StKricer[2][1] = x; StKricer[2][2] = y;}  
		void 	SetKurcaci3						(int x, int y, int dir)		{StKricer[3][0] = dir;StKricer[3][1] = x; StKricer[3][2] = y;}  		
		void 	SetStKricer						(int i1, int i2, int isi)	{StKricer[i1][i2] = isi;};
		
			//ChangeCharPos mengganti posisi karakter tertentu di layar dengan metode Go To, menggunakan method Go.
		void	ChangeCharPos					(int c, int x1, int y1, int dir, int x2, int y2);
		
		//Method print ke layar
		void	PrintTemplate					();						//menampilkan latar dari tampilan layar secara keseluruhan
		void	PrintJam						(int, int);				//menampilkan jam di bagian judul dari tampilan layar
		void	PrintTgl						(int, int);				//menampilkan tanggal di bagian judul dari tampilan layar
		void	PrintLoc						(int);					//menampilkan lokasi pemain di bagian judul dari tampilan layar
		void	PrintKor						(int, int, int);		//menampilkan koordinat pemain di bagian judul dari tampilan layar
		void	PrintCua						(int);					//menampilkan info cuaca permainan di bagian judul dari tampilan layar
		void	PrintMus						(int);					//menampilkan info musim permainan di bagian judul dari tampilan layar
		void	PrintName						(string); 				//menampilkan info nama pemain di panel kiri-atas dari tampilan layar
		void	PrintSt							(int);					//menampilkan info status pemain di panel kiri-atas dari tampilan layar
		void	PrintBuck						(int);					//menampilkan info jumlah uang(Buck) di panel kiri atas dari tampilan layar
		void	PrintFlXY						(int, int);				//menampilkan field tertentu x,y
		void	PrintAllFl						();						//menampilkan seluruh field di bagian tengah layar
		void	PrintKur						(int,int,int);			//menampilkan informasi integer 1 atau 0 menjadi string AWAKE atau SLEEP untuk kurcaci
		void	PrintInv						(Inventory* );			//menampilkan informasi inventory di panel kanan-bawah
		void	PrintCharPos					(int);					//menampilkan creature tertentu di posnya yang sesuai dengan atribut creature tersebut
		void	PrintAllChar					(int,int,int,int);		//menampilkan seluruh creature
		void	PrintODSKW						();						//menampilkan bar OverDosis dan bar Sakaw
		void	PrintInfoBox					(int , string);			//menampilkan info box, berisi bantuan untuk pemain
		void	ClearInfoBox					();						//membersihkan tampilan info box
		void	PrintInfo						(string);				//menampilkan suatu informasi di panel tempat pemain memasukkan perintah
																		//informasi akan ditampilkan dengan delay 2 detik.
		
		void	PrintField						(int m, int ma, int x, int y, AllMap*);			
																		//menampilkan info dari grid field tertentu di panel kiri-bawah
		
		//Method Bantuan display ke layar
		
			//Method Konversi
				string 	ToSTR							(int i);				//melakukan konversi dari integer ke string
				
			//Method lain
				void	StdStr							(string S, int N);		//membuat sebuah string ditampilkan secara justify
				void 	PrintBatas						(int A,int N,int P);	//membuat batas dengan serangkaian karakter ASCII
							//0 : atas
							//1 : tengah
							//2 : bawah
				void	PrintGo							(int d);				//menampilkan sebuah bar loading
				int 	GetTipeField					(int t);				//mendapatkan tipe field tertentu dan mengonversi menjadi kode ASCII yang tepatif
				void 	PrintKsg						(int N);				//menampilkan spasi sejumlah N
				string 	Bar								(int A, int B);			//generate sebuah bar dalam bentuk string dan warna tertentu
				void 	PrintASCII						(int a);				//menampilkan karakter ASCII dengan kode a
				void 	SetWarna						(int fg, int bg);		//mengubah warna latar dan teks commandprompt
				void 	ClearScr						();						//melakukan proses clear screen
				void	Go								(int, int);				//membuat kursor pergi ke koordinat tertentu

};
